/**
 * 安全的 setState 工具函数
 * 避免在 React 组件的渲染过程中调用 setState
 */

export function safeSetState<T>(
  setState: React.Dispatch<React.SetStateAction<T>>,
  value: T | ((prev: T) => T),
  delay: number = 0
): void {
  if (delay > 0) {
    setTimeout(() => {
      setState(value)
    }, delay)
  } else {
    // 使用 requestAnimationFrame 来确保在下一个渲染帧中执行
    requestAnimationFrame(() => {
      setState(value)
    })
  }
}

/**
 * 安全的异步 setState 工具函数
 * 用于在异步操作完成后安全地更新状态
 */
export function safeAsyncSetState<T>(
  setState: React.Dispatch<React.SetStateAction<T>>,
  asyncOperation: () => Promise<T | ((prev: T) => T)>
): void {
  asyncOperation().then((result) => {
    safeSetState(setState, result)
  }).catch((error) => {
    console.error('Async setState operation failed:', error)
  })
}

/**
 * 安全的 toast 调用工具函数
 * 避免在渲染过程中调用 toast
 */
export function safeToast(
  toastFunction: (...args: any[]) => void,
  ...args: any[]
): void {
  requestAnimationFrame(() => {
    toastFunction(...args)
  })
}

/**
 * 安全的 router.push 调用工具函数
 * 避免在渲染过程中调用 router.push
 */
export function safeRouterPush(
  routerPush: (path: string) => void,
  path: string
): void {
  requestAnimationFrame(() => {
    routerPush(path)
  })
}
